package cn.git.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @description: class.getResource与classLoader.getResource获取资源路径信息测试
 *
 * Class.getResource() 可以从当前 Class 所在包的路径开始匹配获取资源，也可以从 classpath 根路径开始匹配获取资源；
 * ClassLoader().getResource() 只能从 classpath 根路径开始匹配获取资源；
 * Class.getResource() 从当前包所在路径获取资源时不能以 "/" 开头，而从 classpath 根路径获取资源时必须以 "/" 开头；
 * ClassLoader().getResource() 不能以 "/" 开头，且路径总是从 classpath 根路径开始；
 * 它们都能通过 getResourceAsStream() 方法获取对应路径文件的输入流，文件路径匹配机制和其 getResource() 方法一样；
 *
 *  @program: bank-credit-sy
 * @author: lixuchun
 * @create: 2024-08-13
 */
@RestController
@RequestMapping("/resource")
public class ResourceTestController {

    /**
     * 通过class获取资源路径信息
     * getResource("") 获取的是当前类所在包的路径，而 getResource("/") 获取的是 classpath 根路径
     */
    @GetMapping("/class")
    public void test() {
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/
        System.out.println(this.getClass().getResource(""));
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/
        System.out.println(this.getClass().getResource("/"));
    }

    /**
     * 获取文件信息
     * 需要注意的是 => .java编译后编程.class，所以这里参数传的文件名是.class结尾
     * 当以 "/" 开头时，是从 classpath 路径开始匹配资源
     * 当不以 "/" 开头时，是从当前类所在包的路径开始匹配资源
     * 两种方式都可以通过 "/" 或 "../" 在文件夹上下层路径切换
     *
     * 另外，在获取文件时，我们还可以通过 getResourceAsStream 直接获取文件输入流
     * InputStream inputStream = this.getClass().getResourceAsStream("/config.properties");
     * 且 getResourceAsStream() 和 getResource() 在获取文件流和文件路径时，路径选择机制是一样的。
     */
    @GetMapping("/properties")
    public void properties() {
        // 获取根目录配置文件
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.yml
        System.out.println(this.getClass().getResource("/application.yml"));
        // null
        System.out.println(this.getClass().getResource("custom.dict"));
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dict
        System.out.println(this.getClass().getResource("/dict/custom.dict"));

        // 获取类文件信息
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/ResourceTestController.class
        System.out.println(this.getClass().getResource("ResourceTestController.class"));

        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/helloApplication.class
        System.out.println(this.getClass().getResource("../helloApplication.class"));

        // null
        System.out.println(this.getClass().getResource("../classpath/helloApplication.class"));
    }

    /**
     * 在使用 ClassLoader().getResource 获取路径时，不能以 "/" 开头，且路径总是从 classpath 根路径开始
     */
    @GetMapping("/classLoader")
    public void classLoader() {
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/
        System.out.println(this.getClass().getClassLoader().getResource(""));
        // null
        System.out.println(this.getClass().getClassLoader().getResource("/"));
    }

    /**
     * ClassLoader().getResource 只能从 classpath 开始获取资源，同样也能使用getResourceAsStream()获取文件输入流，且路径机制一样
     * 同Class.getResourceAsStream()一样，我们还可以通过ClassLoader.getResourceAsStream()直接获取文件输入流
     * ClassLoader.getResourceAsStream() 和 ClassLoader.getResource()在获取文件流和文件路径时，路径选择机制也是一样的
     */
    @GetMapping("/classLoader/properties")
    public void classLoaderProperties() {
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.yml
        System.out.println(this.getClass().getClassLoader().getResource("application.yml"));
        // null
        System.out.println(this.getClass().getClassLoader().getResource("custom.dict"));
        // file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dict
        System.out.println(this.getClass().getClassLoader().getResource("dict/custom.dict"));
    }

}
